package com.dinzeer.legendreliclib.lib.util.dash;

import com.dinzeer.legendreliclib.Legendreliclib;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.network.PacketDistributor;

/**
 * 服务端移动工具类，提供实体移动相关功能。
 * <p>
 * 该类包含以下方法：
 * <ul>
 *   <li>{@link #orbitAroundEntity(Entity, Entity, double, float)}：让一个实体围绕另一个实体做圆周运动。</li>
 *   <li>{@link #sendDashMessage(Player, double, double)}：发送冲刺消息给指定玩家。</li>
 * </ul>
 */
public class SMoveUtil {
    /**
     * 让一个实体围绕另一个实体做圆周运动。
     * <p>
     * 该方法根据当前实体与目标实体的相对位置，计算新的位置并更新实体的朝向。
     *
     * @param follower 跟随的实体
     * @param leader   被跟随的实体
     * @param radius   圆周运动的半径
     * @param speed    旋转速度（每秒的旋转角度）
     */
    public static void orbitAroundEntity(Entity follower, Entity leader, double radius, float speed) {
        Vec3 leaderPos = leader.position();
        Vec3 followerPos = follower.position();

        // 计算当前的偏移角度
        double offsetX = followerPos.x - leaderPos.x;
        double offsetZ = followerPos.z - leaderPos.z;
        double currentAngle = Math.toDegrees(Math.atan2(offsetZ, offsetX)) - 90.0D;

        // 计算新的角度
        double newAngle = currentAngle + speed;

        // 根据新角度计算新的位置
        double newX = leaderPos.x + radius * Math.cos(Math.toRadians(newAngle));
        double newZ = leaderPos.z + radius * Math.sin(Math.toRadians(newAngle));

        // 设置跟随实体的新位置
        follower.setPos(newX, leaderPos.y, newZ);

        // 设置跟随实体的朝向
        float yaw = (float) newAngle;
        follower.setYRot(yaw);
        follower.setYHeadRot(yaw);
    }

    /**
     * 发送冲刺消息给指定玩家。
     * <p>
     * 该方法创建一个 {@link DashMessage} 并通过网络通道发送给指定玩家。
     *
     * @param player    目标玩家
     * @param dy        垂直方向的速度分量
     * @param dashDistance 水平冲刺距离
     */
    public static void sendDashMessage(Player player, double dy, double dashDistance) {
        DashMessage message = new DashMessage(dy, dashDistance);
        if (player.level().isClientSide) return;
        Legendreliclib.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), message);
    }
}
